//
//  WBRefreshControl.swift
//  MicroBlog
//
//  Created by 002 on 15/10/23.
//  Copyright © 2015年 002. All rights reserved.
//

import UIKit

// 下拉偏移量
private let WBRefreshControlOffset : CGFloat = -60

// MARK:自定义刷新控件，负责刷新的逻辑处理
class WBRefreshControl: UIRefreshControl {

    // MARK:重写系统‘监听刷新’方法
    override func beginRefreshing() {
        super.beginRefreshing()
        refreshView.startAnimation()
    }
    
    override func endRefreshing() {
        super.endRefreshing()
        refreshView.stopAnimation()
    }
    
    // MARK: - KVO 监听方法
    /**
    1. 始终待在屏幕上
    2. 下拉的时候，frame 的 y 一直变小，相反（向上推）一直变大
    3. 默认的 y 是 0
    */
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        if frame.origin.y > 0 {
            return
        }
        
        // 判断是否正刷新
        if refreshing {
            refreshView.startAnimation()
            return
        }
        
        if frame.origin.y < WBRefreshControlOffset && !refreshView.rotateFlag {
            print("反过来")
            refreshView.rotateFlag = true
        } else if frame.origin.y >= WBRefreshControlOffset && refreshView.rotateFlag {
            print("转过去")
            refreshView.rotateFlag = false
        }
    }
    override init() {
        super.init()
        
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        
        setupUI()
    }

    // MARK:设置刷新控件界面
    private func setupUI() {
        // 隐藏转轮
        tintColor = UIColor.clearColor()
            
        // 1. 添加控件
        addSubview(refreshView)
        
        // 2. 布局 - 从XIB加载控件需要指定约束
        refreshView.snp_makeConstraints { (make) -> Void in
            make.center.equalTo(self.snp_center)
            make.size.equalTo(refreshView.bounds.size)
        }
        
        // 使用 KVO 监听位置变化 - 主队列，当主线程有任务，就不调度队列中的任务执行
        // 让当前运行循环中所有代码执行完毕后，运行循环结束前，开始监听
        // 方法触发会在下一次运行循环开始！
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            self.addObserver(self, forKeyPath: "frame", options: [], context: nil)
        }
    }
    
    deinit {
        // 删除 KVO 监听方法
        self.removeObserver(self, forKeyPath: "frame")
    }
    // MARK:懒加载控件
    private lazy var refreshView : WBRefreshView = WBRefreshView.refreshView()
}

// 刷新视图，负责动画处理
class WBRefreshView: UIView {
    
    @IBOutlet weak var tipView: UIView!
    @IBOutlet weak var tipIconView: UIImageView!
    @IBOutlet weak var loadingIconView: UIImageView!
    
    // 旋转标识
    var rotateFlag = false {
        didSet {
            rotateTipIcon()
        }
    }
    
    // MARK:‘下拉’加载数据动画
    private func startAnimation() {
        
        // 执行刷新数据时隐藏 ‘下拉开始刷新’视图
        self.tipView.hidden = true
        
        let key = "transform.rotation"
        if self.loadingIconView.layer.animationForKey(key) != nil {
            return
        }
        
        print("开始加载动画")
        
        // 定义动画类型
        let animation = CABasicAnimation.init(keyPath: key)
        
        // 设置动画属性
        animation.toValue = (2 * M_PI)
        animation.repeatCount = MAXFLOAT
        animation.duration = 0.5
        animation.removedOnCompletion = false
        
        // 给加载数据的旋转按钮添加动画
        self.loadingIconView.layer.addAnimation(animation, forKey: key)
    }
    
    // MARK:停止动画
    private func stopAnimation() {
        print("停止动画")
        // 显示 ’下拉开始刷新‘视图
        self.tipView.hidden = false
        // 移除’加载数据动画‘
        self.loadingIconView.layer.removeAllAnimations()
    }
    
    // 旋转下拉图标动画
    private func rotateTipIcon() {
    
        // 旋转动画的 '就近原则' + '顺时针优先'
        var angle = CGFloat(M_PI)
        angle += rotateFlag ? -0.0000001 : 0.0000001
        
        UIView.animateWithDuration(0.5) { () -> Void in
            self.tipIconView.transform = CGAffineTransformRotate(self.tipIconView.transform, CGFloat(angle))
        }
    }
    
    // 从XIB加载视图
    class  func refreshView() -> WBRefreshView{
        
        // 推荐使用NIB加载XIB文件，效率更高
        let nib = UINib(nibName: "WBRefreshView", bundle: nil)
        return nib.instantiateWithOwner(nil, options:nil)[0] as! WBRefreshView
    }
}